java我觉得在实体中添加带有@Transient注释的字段非常容易出错。我说得对吗?
我有一些哲学的直觉,添加未映射到DB的字段会破坏实体类,是解决问题的错误方法
但是,是否存在使用@Transient
字段会导致隐式和难以修复的问题的具体情况
例如,当实体中存在@Transient
字段时,添加或删除二级缓存是否可能会破坏我们的应用程序
相当大的更新:在对@Transient
字段进行了一些思考之后,我觉得@Transient
字段应该以适当的方式使用
我所说的“正确的方式”是指实体总是应该有相同的行为。这意味着,当getter根据@Transient字段值不时返回null
时,这是一种非常容易出错的行为。这意味着@Transient字段应该一直被初始化
我只看到了两个正确使用的案例:
@Transient字段应在对象的构造函数中初始化:
@Entity public class SomeEntity @Id private long id; @Transient private String transientField; public SomeEntity () { transientField = "some string"; } ... }
@Transient字段可以延迟初始化:
@Entity public class SomeEntity @Id private long id; @Transient private String transientField; public String getTransientField () { synchronized (lock) { if (transientField == null) { transientField = "some string"; } } return transientField; } ... }
有谁能说出这两个案例,或者描述一下我错过的其他案例吗
# 1 楼答案
我在一些使用hibernate的项目中使用了瞬态注释,但还没有出现任何问题
它通常用于可由其他持久属性确定的字段,并且使用缓存也应该起作用,因为Java的序列化机制(缓存通常期望缓存的对象是可序列化的)也考虑了瞬态注释。我认为最好尽可能使用提供信息的临时getter和setter属性,而不是实例字段